<?php 
/**
 * Service_Sitemap
 * 
 * Класс обеспечивает генерацию файлов sitemap
 *
 */

class Service_Sitemap {


	protected $objSitemapFile = null;
	protected $objSitemapHotelsFile = null;
	protected $objRobotsFile = null;
	public static $nrHotelsLimitForMultySitemap = 8000;
	
	protected $citiesSitemaped = 0;
	protected $stopSitemapping = false;
	
	public function generateSitemap() {
		$this->objSitemapFile = fopen(ABSPATH . 'sitemap.xml', 'w');
		fwrite($this->objSitemapFile, $this->getSitemapOpen());
			
			// Главная страница
			fwrite($this->objSitemapFile, $this->getUrl(W_FULLPATH, null, 'daily', 1));
			
			$objArticles = new Article();
			
			// Страницы
			$arrPages = $objArticles->find('all', array(
				'conditions' => "`essence_type` = 1"
			));
			foreach ($arrPages as $arrPage) {
				if (!$arrPage['url']) continue;
				fwrite($this->objSitemapFile, $this->getUrl(W_FULLPATH . $arrPage['url'], null, 'weekly', 0.7));
			}
			
			// Статьи
			$arrPages = $objArticles->find('all', array(
					'conditions' => "`essence_type` = 2"
			));
			foreach ($arrPages as $arrPage) {
				if (!$arrPage['url']) continue;
				fwrite($this->objSitemapFile, $this->getUrl(W_FULLPATH . 'articles/' . $arrPage['url'], null, 'weekly', 0.7));
			}
			
			// Категории
			$objCategory = new Category();
			$arrCategories = $objCategory->find('all');
			foreach ($arrCategories as $arrCategory) {
				fwrite($this->objSitemapFile, $this->getUrl(W_FULLPATH . 'categories/' . $arrCategory['url'], null, 'weekly', 0.7));
			}	
			
			// Товары
			$objProduct = new Product();
			$arrProducts = $objProduct->find('all');
			foreach ($arrProducts as $arrProduct) {
				fwrite($this->objSitemapFile, $this->getUrl(W_FULLPATH . 'products/' . $arrProduct['url'], null, 'weekly', 0.5));
			}
		
		fwrite($this->objSitemapFile, $this->getSitemapClose());
		fclose($this->objSitemapFile);
	}
	
	/**
	 * Генерирует файл robots.txt
	 */
	public function generateRobotsTxt() {
		$this->objRobotsFile = fopen(ABSPATH . 'robots.txt', 'w');
		if ($this->objRobotsFile === false) return false;
		if (DOMAIN == 'sportcase.local') {
			$strRobots = "User-agent: *\n";
			$strRobots .= "Disallow: /add_city\n";
			$strRobots .= "Disallow: /search\n";
			$strRobots .= "Allow: /\n";
			$strRobots .= "Crawl-delay: 1\n";      // Задержка между загрузкой двух страниц
			$strRobots .= "Request-rate: 1\n";     // Загружать не более одной страницы за 1 секунду
			$strRobots .= "Host: " . DOMAIN . "\n";
			//$strRobots .= "Visit-time: 0600-0845\n"; // Загружать страницы только в промежуток с 6 утра
			//$strRobots .= "Sitemap: " . W_FULLPATH . "content/sitemap/sitemap.xml\n"; // Sitemap
		}
		else {
			$strRobots = "Disallow: *\n";
		}
		fwrite($this->objRobotsFile, $strRobots);
		fclose($this->objRobotsFile);
	}
	
	
	/**
	 * 
	 * Открывает sitemap
	 */
	public function getSitemapOpen() {
		return '<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";
	}
	
	/**
	 * 
	 * Закрывает sitemap
	 */
	public function getSitemapClose() {
		return '</urlset>';
	}
	
	/**
	 * Получает блок sitemap для одного url
	 * 
	 * @param string $url - ссылка
	 * @param string $lastMod - дата последнего редактирования файла
	 * @param string $changeFreq - частота обновления (always/hourly/daily/weekly/monthly/yearly/never)
	 * @param string $priority - приоритет страницы
	 */
	public function getUrl($url, $lastMod = null, $changeFreq = null, $priority = '0.5') {
		if ($url == '#') return '';
		$retStr = "<url>\n";
		  $retStr .= '<loc>' . Service_Escape::absolutelyEscapeString($url) . "</loc>\n";
		  if($lastMod) $retStr .= '<lastmod>' . $lastMod . "</lastmod>\n";
		  if($changeFreq) $retStr .= '<changefreq>' . $changeFreq . "</changefreq>\n";
		  if($priority) $retStr .= '<priority>' . $priority . "</priority>\n";
		$retStr .= "</url>\n";
		return $retStr;
	}
  	
}
?>